package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/increasing-decreasing-string/'>上升下降字符串(Increasing Decreasing String)</a>
 * <p>
 * 给你一个字符串 s ，请你根据下面的算法重新构造字符串：
 *     <ol>
 *         <li>从 s 中选出 最小 的字符，将它 接在 结果字符串的后面。</li>
 *         <li>从 s 剩余字符中选出 最小 的字符，且该字符比上一个添加的字符大，将它 接在 结果字符串后面。</li>
 *         <li>重复步骤 2 ，直到你没法从 s 中选择字符。</li>
 *         <li>从 s 中选出 最大 的字符，将它 接在 结果字符串的后面。</li>
 *         <li>从 s 剩余字符中选出 最大 的字符，且该字符比上一个添加的字符小，将它 接在 结果字符串后面。</li>
 *         <li>重复步骤 5 ，直到你没法从 s 中选择字符。</li>
 *         <li>重复步骤 1 到 6 ，直到 s 中所有字符都已经被选过。</li>
 *     </ol>
 * </p>
 * <p>在任何一步中，如果最小或者最大字符不止一个 ，你可以选择其中任意一个，并将其添加到结果字符串。</p>
 * <p>请你返回将 s 中字符重新排序后的 结果字符串。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：s = "aaaabbbbcccc"
 *      输出："abccbaabccba"
 *      解释：第一轮的步骤 1，2，3 后，结果字符串为 result = "abc"
 *          第一轮的步骤 4，5，6 后，结果字符串为 result = "abccba"
 *          第一轮结束，现在 s = "aabbcc" ，我们再次回到步骤 1
 *          第二轮的步骤 1，2，3 后，结果字符串为 result = "abccbaabc"
 *          第二轮的步骤 4，5，6 后，结果字符串为 result = "abccbaabccba"
 *
 * 示例 2：
 *      输入：s = "rat"
 *      输出："art"
 *      解释：单词 "rat" 在上述算法重排序以后变成 "art"
 *
 * 示例 3：
 *      输入：s = "leetcode"
 *      输出："cdelotee"
 *
 * 示例 4：
 *      输入：s = "ggggggg"
 *      输出："ggggggg"
 *
 * 示例 5：
 *      输入：s = "spo"
 *      输出："ops"
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *     <ul>
 *         <li>1 <= s.length <= 500</li>
 *         <li>s 只包含小写英文字母。</li>
 *     </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/12/20 13:40
 */
public class LC1370IncreasingDecreasingString_S {

    static class Solution {
        public String sortString(String s) {
            int[] cnt = new int[26];
            int n = s.length();
            for (char ch : s.toCharArray()) {
                ++cnt[ch - 'a'];
            }
            StringBuilder stringBuilder = new StringBuilder();
            while (n > 0) {
                // 第一遍，从 s 剩余字符中选出最小的字符，且该字符比上一个添加的字符大，将它接在结果字符串后面。
                for (int i = 0; i < 26 && n > 0; ++i) {
                    if (cnt[i] > 0) {
                        stringBuilder.append((char) (i + 'a'));
                        --n;
                        --cnt[i];
                    }
                }
                // 第二遍，从 s 剩余字符中选出最大的字符，且该字符比上一个添加的字符小，将它接在结果字符串后面。
                for (int i = 25; i >= 0 && n > 0; --i) {
                    if (cnt[i] > 0) {
                        stringBuilder.append((char) (i + 'a'));
                        --n;
                        --cnt[i];
                    }
                }
            }
            return stringBuilder.toString();
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.sortString("aaaabbbbcccc").equals("abccbaabccba"));
        System.out.println(solution.sortString("rat").equals("art"));
        System.out.println(solution.sortString("leetcode").equals("cdelotee"));
        System.out.println(solution.sortString("ggggggg").equals("ggggggg"));
        System.out.println(solution.sortString("spo").equals("ops"));
    }
}
